﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using WSPDocumentBuilder_WPF.BLL;
using System.IO;
using System.Windows;

namespace WSPDocumentBuilder_WPF.Managers
{
    public static class WSPDocumentBuilderFacade
    {
        public static void GenerateDocumentation(string[] filenames, Action<string> UINotificationAction)
        {
            //====================================================================================================================================
            #region Traitement des packages (Extraction)
            //====================================================================================================================================

            // Liste des éléments
            NotifyUI("Création de la liste des Packages WSP à traiter.", UINotificationAction);
            List<WSPDocumentationInfo> docInfos = new List<WSPDocumentationInfo>();
            foreach (string filename in filenames)
            {
                if ((System.IO.Path.GetExtension(filename)) == ".wsp")
                {
                    docInfos.Add(WSPDocumentationInfo.FromFilePath(filename));
                }
            }

            // Extraction des WSPs
            NotifyUI("Extraction Packages WSP dans le répertoire de données.", UINotificationAction);
            foreach (WSPDocumentationInfo docInfo in docInfos)
            {
                NotifyUI("Extraction du fichier " + docInfo.WspName, UINotificationAction);
                WSPManager.ExtractWSP(docInfo);
            }

            //====================================================================================================================================
            #endregion Traitement des packages (Extraction)
            //====================================================================================================================================


            //====================================================================================================================================
            #region Génération de la documentation unitaire
            //====================================================================================================================================

            // Génération de la documentation de chaque WSP
            NotifyUI("Génération de la documentation.", UINotificationAction);
            foreach (WSPDocumentationInfo docInfo in docInfos)
            {
                // Génération de la documentation Xml unitaire
                NotifyUI("Génération de la documentation Xml du package " + docInfo.WspName, UINotificationAction);
                XslManager.GenerateXml(docInfo);

                // Génération de la documentation ExcelXml unitaire
                NotifyUI("Génération de la documentation ExcelXml du package " + docInfo.WspName, UINotificationAction);
                XslManager.GenerateExcelXml(docInfo);
            }

            //====================================================================================================================================
            #endregion Génération de la documentation unitaire
            //====================================================================================================================================


            //====================================================================================================================================
            #region Génération de la documentation globale
            //====================================================================================================================================

            // Fusion des fichiers xml générés
            NotifyUI("Génération de la documentation Xml GLOBALE.", UINotificationAction);
            string mergedXmlFilePath = LocationManager.DataPath + @"\mergedDocumentation.xml";
            XmlManager.MergeTo(
                    docInfos.Select(di => di.XmlFilePath).ToArray(),
                    mergedXmlFilePath,
                    (xDoc, filename) =>
                    {
                        xDoc.Root.SetAttributeValue("SolutionName", filename);
                    }
                );

            // Génération de la documentation ExcelXml générale
            NotifyUI("Génération de la documentation ExcelXml GLOBALE.", UINotificationAction);
            string globalExcelXmlFilePath = LocationManager.DataPath + @"\mergedDocumentation-Excel.xml";
            XslManager.GenerateExcelXml(mergedXmlFilePath, globalExcelXmlFilePath);

            //====================================================================================================================================
            #endregion Génération de la documentation globale
            //====================================================================================================================================


            //====================================================================================================================================
            #region Remplacement des Tokens SharePoint
            //====================================================================================================================================

            // Remplacement des Tokens SharePoint de ressource ($Resource:...,...;)
            NotifyUI("Génération de la documentation Xml GLOBALE sans Tokens.", UINotificationAction);
            string mergedTokenLessXmlFilePath = LocationManager.DataPath + @"\mergedDocumentation-TokenLess.xml";
            XslManager.ReplaceSPResourceTokens(mergedXmlFilePath, mergedTokenLessXmlFilePath);

            // Génération de la documentation ExcelXml générale
            NotifyUI("Génération de la documentation ExcelXml GLOBALE sans Tokens.", UINotificationAction);
            string globalTokenLessExcelXmlFilePath = LocationManager.DataPath + @"\mergedDocumentation-Excel-TokenLess.xml";
            XslManager.GenerateExcelXml(mergedTokenLessXmlFilePath, globalTokenLessExcelXmlFilePath);

            //====================================================================================================================================
            #endregion Remplacement des Tokens SharePoint
            //====================================================================================================================================

            // Suppression des dossiers temporaires
            NotifyUI("Nettoyage des dossiers temporaires.", UINotificationAction);
            foreach (WSPDocumentationInfo docInfo in docInfos)
            {
                try
                {
                    Directory.Delete(docInfo.ExtractionPath, true);
                }
                catch
                {
                    // TODO : Traiter l'erreur
                }
            }

            // Fin des opérations
            NotifyUI("Génération globale terminée.", UINotificationAction);
        }

        public static void NotifyUI(string message, Action<string> UINotificationAction)
        {
            if (UINotificationAction != null)
            {
                Application.Current.Dispatcher.Invoke(UINotificationAction, message);
            }
        }
    }
}
